package cn.com.dcsgo.mapper;

import cn.com.dcsgo.domain.dto.SysRoleQueryDTO;
import cn.com.dcsgo.domain.po.SysRole;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 针对表【sys_role(角色信息表)】的数据库操作Mapper
 *
 * @author Dcsgo
 * @since 1/6/2025 下午 2:18
 */
public interface SysRoleMapper {

    int deleteByPrimaryKey(Long id);

    int insert(SysRole record);

    int insertSelective(SysRole record);

    SysRole selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(SysRole record);

    int updateByPrimaryKey(SysRole record);

    /**
     * 根据角色名称和状态查询角色信息
     *
     * @param params 色信息查询参数(角色名称和状态)
     * @return 角色信息，按 role-sort 升序
     */
    List<SysRole> selectByRoleNameAndStatus(@Param("params") SysRoleQueryDTO params);

    /**
     * 根据角色名称、状态和用户id查询角色信息
     *
     * @param params 色信息查询参数(角色名称和状态)
     * @param userId 用户id
     * @return 角色信息，按 role-sort 升序
     */
    List<SysRole> selectByRoleNameAndStatusAndUserId(@Param("params") SysRoleQueryDTO params, @Param("userId") Long userId);

    /**
     * 根据角色id删除用户与角色关联表中的关联数据
     *
     * @param roleId 角色id
     * @return 受影响的行数
     */
    int deleteUserRoleByRoleId(@Param("roleId") Long roleId);

    /**
     * 根据角色id删除角色与菜单关联表中的关联数据
     *
     * @param roleId 角色id
     * @return 受影响的行数
     */
    int deleteRoleMenuByRoleId(@Param("roleId") Long roleId);

    /**
     * 根据用户id删除用户与角色关联表中的关联数据
     *
     * @param userId 用户id
     * @return 受影响的行数
     */
    int deleteUserRoleByUserId(@Param("userId") Long userId);

    /**
     * 根据菜单id删除角色与菜单关联表中的关联数据
     *
     * @param menuId 菜单id
     * @return 受影响的行数
     */
    int deleteRoleMenuByMenuId(@Param("menuId") Long menuId);

    /**
     * 根据角色id查询状态正常并且为叶子节点的菜单编号
     *
     * @param roleId 角色id
     * @return 状态正常且为叶子节点的菜单编号
     */
    List<Long> selectLeafMenuIdListByRoleId(@Param("roleId") Long roleId);

    /**
     * 向角色菜单关联表中批量插入数据
     *
     * @param roleId  角色id
     * @param menuIds 菜单id集合
     * @return 受影响的行数
     */
    int batchInsertRoleMenu(@Param("roleId") Long roleId, @Param("menuIds") List<Long> menuIds);

    /**
     * 查询所有角色信息
     *
     * @return 所有状态为正常的角色信息
     */
    List<SysRole> selectAll();

    /**
     * 查询所有用户所拥有的角色信息
     *
     * @param userId 用户id
     * @return 用户所拥有的所有状态正常的角色信息
     */
    List<SysRole> selectByUserId(@Param("userId") Long userId);

    /**
     * 批量添加用户角色关联数据
     *
     * @param userId  用户id
     * @param roleIds 角色id集合
     * @return 受影响的行数
     */
    int batchInsertUserRole(@Param("userId") Long userId, @Param("roleIds") List<Long> roleIds);
}
